'''
basic - 30  阶乘计算

问题描述
　　输入一个正整数n，输出n!的值。
　　其中n!=1*2*3*…*n。
算法描述
　　n!可能很大，而计算机能表示的整数范围有限，需要使用高精度计算的方法。
    使用一个数组A来表示一个大整数a，A[0]表示a的个位，A[1]表示a的十位，依次类推。
　　将a乘以一个整数k变为将数组A的每一个元素都乘以k，请注意处理相应的进位。
　　首先将a设为1，然后乘2，乘3，当乘到n时，即得到了n!的值。
输入格式
　　输入包含一个正整数n，n<=1000。
输出格式
　　输出n!的准确值。
样例输入
10
样例输出
3628800
'''

"""
Author: CharlesWYQ Time: 2021/3/3 15:21
Name: BASIC-30 VIP试题 阶乘计算

input()函数用于获取用户输入的字符串。
int(input())将用户输入的字符串转换为整数。
m.factorial(...)调用math模块中的factorial函数，计算该整数的阶乘。
print(...)将计算得到的阶乘值输出到屏幕上。
例如，如果用户输入5，代码将输出120，因为5的阶乘（5 * 4 * 3 * 2 * 1）等于120。
"""
# import math as m
# print(m.factorial(int(input())))





'''

解题思路：

定义一个数组 A，初始时只有一个元素为 1，表示整数的初始值为 1。
从 2 开始到 n，依次将数组 A 的每个元素乘以当前的数，并处理进位。
将计算得到的结果数组 A 输出即可。
'''


# n = int(input())
#
# # 初始化结果数组A，初始时只有一个元素为 1，表示整数的初始值为 1。
# A = [1]
#
# # 计算 n!
# # 从 2 开始到 n，依次遍历每个数。
# for i in range(2, n+1):
#     # 逐位乘以当前数并处理进位
#     r = 0  # 进位 ;  定义一个变量 r，用来记录进位的值，初始时为 0。
#
#     # 遍历数组 A 的每个元素，即遍历整数的每一位。
#     for j in range(len(A)):
#         # 将数组 A 的第 j 位乘以当前的数 i，加上进位 r 的值。
#         A[j] = A[j] * i + r
#         # r = A[j] // 10 和 A[j] %= 10：将乘法的结果除以 10 得到进位，并将结果取模 10 得到当前位的值。
#         r = A[j] // 10
#         A[j] %= 10
#
#     # 处理最高位的进位
#     # while r > 0:：如果还有进位，则继续处理。
#     while r > 0:
#         # A.append(r % 10) 和 r //= 10：将进位的个位数添加到数组 A 的末尾，并将进位的十位数赋值给变量 r。
#         A.append(r % 10)
#         r //= 10
#
# # 将结果反转并转化为字符串
# # 将数组 A 反转后，使用列表推导式将每个元素转化为字符串，并将它们连接起来得到一个字符串。
# result = ''.join(str(x) for x in A[::-1])
#
# print(result)








'''
这段代码是用来计算一个整数的阶乘的。阶乘是一个数与所有小于它的正整数的乘积。
例如，5的阶乘（记作5!）是5 * 4 * 3 * 2 * 1 = 120。
'''
# n = int(input())
#
# # 初始化结果数组 ; 初始化一个列表A，包含一个元素1。这个列表用来存储阶乘的每一位数字。
# A = [1]
#
#
# #环从2到n，用于计算n!。
# # 在循环内部，有一个内部循环for j in range(len(A))，用于逐位乘以当前的数i并处理进位。
# for i in range(2, n+1):
#     # 逐位乘以当前数并处理进位
#     r = 0  # 进位,初始化进位为0。
#
#     for j in range(len(A)):
#         # 在内部循环中，每个数字A[j]与i相乘，并将结果加上之前的进位r。
#         # 然后更新进位r为除以10的余数，并将A[j]取模10，以确保它始终是一个单个数字。
#         A[j] = A[j] * i + r
#         r = A[j] // 10
#         A[j] %= 10
#
#     # 外部循环结束后，还需要处理最高位的进位。
#     # 这是通过一个循环完成的，该循环将最高位的进位添加到列表的末尾，直到进位为0。
#
#     # 处理最高位的进位
#     while r > 0:
#         A.append(r % 10)
#         r //= 10
#
# # 将结果反转并转化为字符串
# # 最后，将列表A中的数字反转，并将它们转换为字符串。这是通过使用Python的切片和列表解析完成的。
# result = ''.join(str(x) for x in A[::-1])
#
# print(result)

n = int(input())
A = [1]

for i in range(2, n + 1):
    r = 0
    for j in range(len(A)):
        A[j] = A[j] * i + r
        r = A[j] // 10
        A[j] = A[j] % 10

    while r > 0:
        A.append(r % 10)
        r = r // 10
result = ''.join(str(x) for x in A[::-1])
print(result)

